﻿using System;
using System.Collections.Generic;
using System.Data;
using AccesoData.Interfaces;
using Entidades;
using MySql.Data.MySqlClient;

namespace AccesoData.DAOMySql
{
    /// <summary>
    /// clase que lleva el control sobre la entidad Poliza de la base de datos de mysql
    /// </summary>
    class DAOPolizaMySql:ConexionBaseDatos, IDAOPoliza
    {
        /// <summary>
        /// Agrega un poliza a la base de datos
        /// </summary>
        /// <param name="miPoliza"></param>
        /// <returns></returns>
        public int AgregarPoliza(Poliza miPoliza)
        {
            MySqlCommand comando = new MySqlCommand();
            comando.Connection = Conexion();
            comando.CommandType = CommandType.StoredProcedure;
            comando.CommandText = "AgregarPoliza";


            comando.Parameters.AddWithValue("@idAseguradora", miPoliza.Aseguradora.Id);
            comando.Parameters.AddWithValue("@idCliente", miPoliza.Cliente.Id);
            comando.Parameters.AddWithValue("@idRamo", miPoliza.Ramo.Id);
            comando.Parameters.AddWithValue("@numero", miPoliza.Numero);

            comando.Parameters["@idAseguradora"].Direction = ParameterDirection.Input;
            comando.Parameters["@idCliente"].Direction = ParameterDirection.Input;
            comando.Parameters["@idRamo"].Direction = ParameterDirection.Input;
            comando.Parameters["@numero"].Direction = ParameterDirection.Input;

            int id = 0;
            MySqlDataReader reader = comando.ExecuteReader();
            while (reader.Read())
            {
                id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
            }

            CerrarConexion();
            return id;
        }

        /// <summary>
        /// obtiene los datos de una poliza dado su identificador
        /// </summary>
        /// <param name="idPoliza"></param>
        /// <returns></returns>
        public Poliza ObtenerPoliza(int idPoliza)
        {
            MySqlCommand comando = new MySqlCommand();
            Poliza miPoliza = FabricaEntidades.ObtenerPoliza();

            comando.Connection = Conexion();
            comando.CommandType = CommandType.StoredProcedure;
            comando.CommandText = "ObtenerPolizaId";
            comando.Parameters.AddWithValue("@idPoliza", idPoliza);
            comando.Parameters["@idPoliza"].Direction = ParameterDirection.Input;

            MySqlDataReader reader = comando.ExecuteReader();
            while (reader.Read())
            {
                miPoliza.Id = idPoliza;
                miPoliza.Aseguradora.Id = (int)reader[1];
                miPoliza.Cliente.Id = (reader[2] == DBNull.Value) ? -1 : (int)reader[2];
                miPoliza.Ramo.Id = (int) reader[3];
                miPoliza.Numero = (string) reader[4];
            }

            reader.Close();
            CerrarConexion();
            return miPoliza;
        }

        /// <summary>
        /// Metodo que obtiene una poliza de la base de datos dado su numero y la compañia de
        /// de seguros
        /// </summary>
        /// <param name="idAseguradora"></param>
        /// <param name="numeroPoliza"></param>
        /// <returns></returns>
        public Poliza ObtenerPoliza(int idAseguradora, string numeroPoliza)
        {
            MySqlCommand comando = new MySqlCommand();
            Poliza miPoliza = FabricaEntidades.ObtenerPoliza();

            comando.Connection = Conexion();
            comando.CommandType = CommandType.StoredProcedure;
            comando.CommandText = "ObtenerPoliza";
            comando.Parameters.AddWithValue("@idAseguradora", idAseguradora);
            comando.Parameters["@idAseguradora"].Direction = ParameterDirection.Input;
            comando.Parameters.AddWithValue("@numeroPoliza", numeroPoliza);
            comando.Parameters["@numeroPoliza"].Direction = ParameterDirection.Input;

            MySqlDataReader reader = comando.ExecuteReader();
            while (reader.Read())
            {
                miPoliza.Id = (int) reader[0];
                miPoliza.Aseguradora.Id = (int)reader[1];
                miPoliza.Cliente.Id = (reader[2] == DBNull.Value) ? -1 : (int)reader[2];
                miPoliza.Ramo.Id = (int)reader[3];
                miPoliza.Numero = (string)reader[4];
            }

            reader.Close();
            CerrarConexion();
            return miPoliza;
        }
        /// <summary>
        /// metodo que obtiene todas las polizas de un cliente en particular
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        public List<Poliza> ObtenerPolizasCliente(int idCliente)
        {
            List<Poliza> retorno = new List<Poliza>();
            MySqlCommand comando = new MySqlCommand();
            

            comando.Connection = Conexion();
            comando.CommandType = CommandType.StoredProcedure;
            comando.CommandText = "ObtenerPolizasCliente";
            comando.Parameters.AddWithValue("@idCliente", idCliente);
            comando.Parameters["@idCliente"].Direction = ParameterDirection.Input;

            MySqlDataReader reader = comando.ExecuteReader();
            while (reader.Read())
            {
                Poliza miPoliza = FabricaEntidades.ObtenerPoliza();
                miPoliza.Id = (int)reader[0];
                miPoliza.Aseguradora.Id = (int)reader[1];
                miPoliza.Cliente.Id = (reader[2] == DBNull.Value) ? -1 : (int)reader[2];
                miPoliza.Ramo.Id = (int)reader[3];
                miPoliza.Numero = (string)reader[4];
                retorno.Add(miPoliza);
            }

            reader.Close();
            CerrarConexion();
            return retorno;
        }

        public bool EditarPoliza(Poliza miPoliza)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Obtiene los datos de la poliza dado su numero
        /// </summary>
        /// <param name="numero"></param>
        /// <returns></returns>
        public List<Poliza> ObtenerPolizaNumero(string numero)
        {
            try
            {
                List<Poliza> retorno = new List<Poliza>();
                MySqlCommand comando = new MySqlCommand();
            

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerPolizaNumero";
                comando.Parameters.AddWithValue("@numeroPoliza", numero);
                comando.Parameters["@numeroPoliza"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    Poliza miPoliza = FabricaEntidades.ObtenerPoliza();
                    miPoliza.Id = (int)reader[0];
                    miPoliza.Aseguradora.Id = (int)reader[1];
                    miPoliza.Cliente.Id = (reader[2] == DBNull.Value) ? -1 : (int)reader[2];
                    miPoliza.Ramo.Id = (int)reader[3];
                    miPoliza.Numero = (string)reader[4];
                    retorno.Add(miPoliza);
                }

                reader.Close();
                CerrarConexion();
                return retorno;
        
            }
            catch (Exception)
            {
                
                return null;
            }
        }
        /// <summary>
        /// Obtiene una lista de polizas dado  una aseguradora
        /// </summary>
        /// <param name="idAseguradora"></param>
        /// <returns></returns>
        public List<Poliza> ObtenerPolizaAseguradora(int idAseguradora)
        {
            try
            {
                List<Poliza> retorno = new List<Poliza>();
                MySqlCommand comando = new MySqlCommand();


                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerPolizaAseguradora";
                comando.Parameters.AddWithValue("@idAseguradora", idAseguradora);
                comando.Parameters["@idAseguradora"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    Poliza miPoliza = FabricaEntidades.ObtenerPoliza();
                    miPoliza.Id = (int)reader[0];
                    miPoliza.Aseguradora.Id = (int)reader[1];
                    miPoliza.Cliente.Id = (reader[2] == DBNull.Value) ? -1 : (int)reader[2];
                    miPoliza.Ramo.Id = (int)reader[3];
                    miPoliza.Numero = (string)reader[4];
                    retorno.Add(miPoliza);
                }

                reader.Close();
                CerrarConexion();
                return retorno;

            }
            catch (Exception)
            {

                return null;
            }
        }
    }
}
